package ihm;

import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Calendar;
import java.util.List;
import java.util.Scanner;
import java.util.regex.Pattern;

import moyenDeTransport.Billet;
import moyenDeTransport.Trajet;
import moyenDeTransport.Vehicule;
import moyenDeTransport.Ville;

import serveur.Serveur;
import serveur.ServeurV1;
import serveur.ServeurV2;
import serveur.ServeurV3;

/**
 * Cette classes fait partie de l'application d'un système de réservation de
 * moyens de transport en commun. Cette classe est le client d'administration
 * qui permet de gérer en ligne de commande les véhicules et les trajets. Il
 * contient toutes les fonctions pour faire le lien entre les instructions
 * données via la ligne de commande et les fonctions de l'admin.
 * 
 * @author Fauconnier Simon  Bourdin Théo Jimenez Matthieu Shimabukuro Emmanuel
 */

public class ClientAdmin {
    private Parser parser;
    private Serveur s;
    private Users a;
    Scanner scan = new Scanner(System.in);
    String nom;
    String prenom;
    boolean isAdmin;

    /**
     * créer une instance du client d'administration
     * 
     * @param version
     *            la version du serveur choisi
     */
    public ClientAdmin(int version) {
        parser = new Parser(); // créer un parser
        scan = new Scanner(System.in);
        if (version==1) {
            s = new ServeurV1();
            a = new Users(s);
        } else if (version==2) {
            s = new ServeurV2();
        a = new Users(s); // créer une instance d'admin
    }
        else{
            s=new ServeurV3();
            a = new Users(s);
        }
    }
    public String getNom() {
        return nom;
    }

    public void setNom(String nom) {
        this.nom = nom;
    }

    public String getPrenom() {
        return prenom;
    }

    public void setPrenom(String prenom) {
        this.prenom = prenom;
    }

    public boolean isAdmin() {
        return isAdmin;
    }

    public void setAdmin(boolean isAdmin) {
        this.isAdmin = isAdmin;
    }

    /**
     * Lance le client d'administration
     * 
     * @throws IOException
     * @throws ClassNotFoundException
     * @throws Exception
     */
    protected void launch() throws IOException, ClassNotFoundException,
            Exception {
        boolean finished = false;
        System.out
                .println("Voulez vous lancer le programme en tant qu'administrateur ? o/n");
        String reponse = scan.nextLine();
        if (reponse.compareTo("o") == 0) {
            System.out.println("Veuillez entrez le code :");
            reponse = scan.nextLine();
            if (reponse.compareTo("epu") == 0) {
                printHelpAdmin();
                this.setAdmin(true);
            } else {
                System.out
                        .println("Le code est erronné veuillez relancer le programme.");
                finished = true;
            }
        } else {
            System.out.println("Veuillez entrer votre nom:");
            this.setNom(scan.nextLine());
            System.out.println("Veuillez entrer votre prenom:");
            this.setPrenom(scan.nextLine());
            printHelpClient();
            this.setAdmin(false);
        }
        // A chaque tour de boucle, on charge les données du serveur avant tout
        // Quand on a fini de travailler, on sauvegarde les éventuelles
        // modifications
        while (!finished) {
            if (!a.lancerChargement())
                a.lancerSauvegarde();
            Command command = parser.getCommand();
            try {
                finished = processCommand(command);
            } catch (Exception e) {
                System.err.println(e);
            }
            a.lancerSauvegarde();
        }
    }

    /**
     * Exécute une commande donnée
     * 
     * @param command
     *            la commande à exécuter
     * @return true si on veut quitter le client, false sinon
     * @throws Exception
     */
    private boolean processCommand(Command command) throws Exception {
        boolean wantToQuit = false;

        CommandWord commandWord = command.getCommandWord();

        if (commandWord == CommandWord.INCONNU) {
            System.out.println("Mot inconnu...");
            return false;
        }

        // On gère les différentes méthodes possibles
        if (commandWord == CommandWord.AIDE) {
            if (isAdmin()) {
                printHelpAdmin();
            } else {
                printHelpClient();
            }
        } else if (commandWord == CommandWord.CONSULTER) {
            consulter(command);
        } else if (commandWord == CommandWord.AJOUTER) {
            ajouter(command);
        } else if (commandWord == CommandWord.MODIFIER) {
            modifier(command);
        } else if (commandWord == CommandWord.SUPPRIMER) {
            supprimer(command);
        } else if (commandWord == CommandWord.RECHERCHER) {
            rechercher(command);
        } else if (commandWord == CommandWord.RESERVER) {
            reserver(command);
        } else if (commandWord == CommandWord.QUITTER) {
            wantToQuit = quit(command);
        }

        return wantToQuit;
    }

    /**
     * "quitter" a été entré. Quitter le client d'admin.
     * 
     * @param command
     *            la commande à exécuter
     * @return true si on a quitter le client, false sinon
     */
    private boolean quit(Command command) {
        if (command.hasSecondWord()) {
            System.out.println("Quitter quoi ?");
            return false;
        } else {
            return true; // signal pour dire qu'on veut quitter
        }
    }

    /**
     * "aide" a été entré. Affiche l'aide pour l'administrateur.
     */
    private void printHelpAdmin() {
        System.out
                .println("Les commandes possibles sont :\n ajouter   modifier   supprimer   consulter   rechercher   aide   quitter");
    }

    /**
     * "aide" a été entré. Affiche l'aide pour le client.
     */
    private void printHelpClient() {
        printOffre();
        System.out
                .println("Les commandes possibles sont :\nreserver   rechercher   consulter  aide  quitter");
    }

    /**
     * Consulter les trajets ou les véhicules
     * 
     * @param command
     *            la commande à exécuter
     */
    private void consulter(Command command) {
        if (!command.hasSecondWord()) {
            System.out.println("Consulter quoi ? trajets ou vehicules ?");
            return;
        }

        String quoi = command.getSecondWord();

        if (quoi.equals("trajets")) {
            a.consulterTrajet();
        } else if (quoi.equals("vehicules")) {
            a.consulterVehicules();
        } else {
            System.out
                    .println("Vous ne pouvez consulter que des trajets ou des vehicules");
        }
    }

    /**
     * Rechercher des trajets
     * 
     * @param command
     *            la commande à exécuter
     * @throws Exception
     */
    private void rechercher(Command command) throws Exception {
        if (!command.hasSecondWord()) {
            System.out.println("Rechercher quoi ? trajets ?");
            return;
        }

        String quoi = command.getSecondWord();

        if (quoi.equals("trajets")) {
            // on demande les infos sur les trajets à rechercher
            String depart = "";
            String arrivee = "";
            String vehicule = "";
            int placesVoulues = 1;
            String dateDepart = "";
            String horaireDepart = "";
            int intervalleVoulue = 12;
            Ville ville = Ville.BORDEAUX;

            // On demande à l'utilisateur toutes les infos qu'on veut
            // puis on vérifie si ce qui a été entré est correct

            System.out.print("Date de départ (jj/mm/aaaa) : ");
            Scanner tokenizer = new Scanner((new Scanner(System.in)).nextLine());
            if (tokenizer.hasNext()) {
                dateDepart = tokenizer.next(); // récupère le premier mot
            }
            if (!Pattern.matches("[0-9]{1,2}/[0-9]{1,2}/[0-9]{4}", dateDepart))
                throw new Exception("Date de départ mal écrite");

            System.out.print("Horaire de départ (hh:mm) : ");
            tokenizer = new Scanner((new Scanner(System.in)).nextLine());
            if (tokenizer.hasNext()) {
                horaireDepart = tokenizer.next(); // récupère le premier mot
            }
            if (!Pattern.matches("[0-9]{1,2}:[0-9]{1,2}", horaireDepart))
                throw new Exception("Heure de départ mal écrite");

            System.out
                    .print("Choissisez un lieu de départ dans la liste suivante :\n");
            ville.printVille();
            System.out.println("Inscriver l'indice de la ville choisie");
            tokenizer = new Scanner((new Scanner(System.in)).nextLine());
            if (tokenizer.hasNext()) {
                int x = Integer.parseInt(tokenizer.next()); // récupère le
                                                            // premier mot
                depart = ville.getVille(x).toString();
            }
            if (depart.trim() == "")
                throw new Exception("Lieu de départ vide");

            System.out
                    .print("Choissisez un lieu d'arrivee dans la liste suivante :\n");
            ville.printVille();
            System.out.println("Inscriver l'indice de la ville choisie");
            tokenizer = new Scanner((new Scanner(System.in)).nextLine());
            if (tokenizer.hasNext()) {
                int x = Integer.parseInt(tokenizer.next()); // récupère le
                                                            // premier mot
                arrivee = ville.getVille(x).toString();
            }
            if (arrivee.trim() == "")
                throw new Exception("Lieu de départ vide");

            System.out.print("Véhicule (défaut=n'importe lequel) : ");
            tokenizer = new Scanner((new Scanner(System.in)).nextLine());
            if (tokenizer.hasNext()) {
                vehicule = tokenizer.next(); // récupère le premier mot
            }

            System.out.print("Places voulues (défaut=1) : ");
            tokenizer = new Scanner((new Scanner(System.in)).nextLine());
            if (tokenizer.hasNext()) {
                placesVoulues = Integer.valueOf(tokenizer.next()); // récupère
                // le premier
                // mot
            }
            if (placesVoulues == 0)
                placesVoulues = 1;

            Calendar dateCompleteDepart = Serveur.textToCalendar(dateDepart,
                    horaireDepart);
            if (dateCompleteDepart == null)
                throw new Exception("date de départ mal écrite");

            // on recherche les trajets correspondant aux paramètres rentrés
            List<Trajet> trajetRecherche = a.rechercherTrajet(depart, arrivee,
                    vehicule, placesVoulues, dateCompleteDepart,
                    intervalleVoulue);

            // on affiche les trajets correspondant aux paramètres rentrés, s'il
            // y en a
            if (trajetRecherche != null && trajetRecherche.size() != 0) {
                for (Trajet t : trajetRecherche) {
                    System.out.println(t);
                }
            } else
                System.out.println("Aucun trajet ne correspond.");
        } else {
            System.out.println("Vous ne pouvez rechercher que des trajets");
        }
    }

    /**
     * Réserver un trajet
     * 
     * @param command
     *            la commande à exécuter
     * @throws Exception
     */
    private void reserver(Command command) throws Exception {
        Billet billet = null;
        int placesEnfants = 0;
        int placesAdultes = 0;
        boolean premiere = false;
        boolean seconde = false;
        boolean eco = true;
        if (!command.hasSecondWord()) {
            System.out.println("Réserver quoi ? trajets ?");
            return;
        }

        String quoi = command.getSecondWord();

        if (quoi.equals("trajets")) {
            // on demande les infos sur le trajet à réserver
            Trajet trajetAReserver = null;
            int placesVoulues = 1;

            a.consulterTrajet();

            // On demande à l'utilisateur toutes les infos qu'on veut
            // puis on vérifie si ce qui a été entré est correct
            System.out.print("Trajet à réserver (id) : ");
            Scanner tokenizer = new Scanner((new Scanner(System.in)).nextLine());
            if (tokenizer.hasNext()) {
                trajetAReserver = a
                        .getTrajet(Integer.valueOf(tokenizer.next())); // récupère
                // le
                // premier
                // mot
            }

            System.out.print("Places voulues (défaut=1) : ");
            tokenizer = new Scanner((new Scanner(System.in)).nextLine());
            if (tokenizer.hasNext()) {
                placesVoulues = Integer.valueOf(tokenizer.next()); // récupère
                // le premier
                // mot
            }
            if (placesVoulues == 0)
                placesVoulues = 1;
            System.out
                    .println("Sur ce nombre de places combien y a t-il de places enfant : ");
            tokenizer = new Scanner((new Scanner(System.in)).nextLine());
            if (tokenizer.hasNext()) {
                placesEnfants = Integer.valueOf(tokenizer.next()); // récupère
                                                                   // le premier
                                                                   // mot
                placesAdultes = placesVoulues - placesEnfants;
            }

            System.out
                    .println("Voulez vous vos billets en premiere classe(1), en seconde (2) ou en classe eco(3)\nEntrez l'indice correspondant a votre choix(choix par défaut places éco) :");
            tokenizer = new Scanner((new Scanner(System.in)).nextLine());
            if (tokenizer.hasNext()) {
                int x = Integer.valueOf(tokenizer.next());
                if (x == 1) {
                    premiere = true;
                    eco = false;
                }
                if (x == 2) {
                    seconde = true;
                    eco = false;
                }
            }

            // On regarde si le trajet existe
            if (trajetAReserver != null) {
                // On réserve le trajet que s'il reste des places
                if (a.reserver(trajetAReserver, placesVoulues, premiere,
                        seconde, eco)) {
                    billet = new Billet(trajetAReserver.getPrix(), 0);
                    if (placesVoulues == placesAdultes) {
                        billet.setPrixFinal(billet.calculPrix(placesVoulues, 0));
                    } else {
                        billet.setPrixFinal(billet.calculPrix(placesAdultes,
                                placesEnfants));
                    }
                    if (premiere) {
                        billet.setPrixFinal(billet.ajoutPremiereClasse());
                    } else if (seconde)
                        billet.setPrixFinal(billet.ajoutSecondeClasse());
                    if (trajetAReserver.isCouchette()) {
                        System.out
                                .println("Ce trajet propose des couchettes, voulez vous en reservez pour tout vos billets(pour un prix de 25euros par billet) : o/n");
                        tokenizer = new Scanner(
                                (new Scanner(System.in)).nextLine());
                        if (tokenizer.hasNext()) {
                            String reponse = tokenizer.next(); // récupère le
                                                               // premier mot
                            if (reponse.compareTo("o") == 0)
                                billet.ajoutPrixCouchette(placesVoulues);
                        }
                    }
                    if (trajetAReserver.isRepas()) {
                        System.out
                                .println("Ce trajet propose des repas, voulez vous en reservez pour tout vos billets(pour un prix de 10euros par billet) : o/n");
                        tokenizer = new Scanner(
                                (new Scanner(System.in)).nextLine());
                        if (tokenizer.hasNext()) {
                            String reponse = tokenizer.next(); // récupère le
                                                               // premier mot
                            if (reponse.compareTo("o") == 0)
                                billet.ajoutPrixRepas(placesVoulues);
                        }
                    }
                    System.out.println("Vous venez de reserver "
                            + placesVoulues + " places pour le trajet"
                            + " dont l'identifiant est le suivant : "
                            + trajetAReserver.getIdentifiant());
                    billet.printCoutFinal();
                    html(trajetAReserver, placesVoulues, nom, billet);
                }

                else
                    System.out

                            .println("Il ne reste plus de place à bord de ce véhicule !");

            } else {
                System.out.println("Mauvais identifiant.");
            }
        } else {
            System.out.println("Vous ne pouvez réserver que des trajets");
        }
    }

    /**
     * Ajouter un trajet ou un véhicule
     * 
     * @param command
     *            la commande à exécuter
     * @throws Exception
     */
    private void ajouter(Command command) throws Exception {
        if (!command.hasSecondWord()) {
            System.out.println("Ajouter quoi ? trajet ou vehicule ?");
            return;
        }

        String quoi = command.getSecondWord();
        if (quoi.equals("trajet")) {
            // on demande les infos sur le trajet à ajouter
            String dateDepart = "";
            String dateArrivee = "";
            String horaireDepart = "";
            String horaireArrivee = "";
            Ville depart = Ville.BORDEAUX;
            Ville arrivee = Ville.MARSEILLE;
            int idVehicule = 0;
            float prix = 0;
            boolean couchette = false;
            boolean repas = false;

            // On demande à l'utilisateur toutes les infos qu'on veut
            // puis on vérifie si ce qui a été entré est correct
            System.out.print("Date de départ (jj/mm/aaaa) : ");
            Scanner tokenizer = new Scanner((new Scanner(System.in)).nextLine());
            if (tokenizer.hasNext()) {
                dateDepart = tokenizer.next(); // récupère le premier mot
            }
            if (!Pattern.matches("[0-9]{1,2}/[0-9]{1,2}/[0-9]{4}", dateDepart))
                throw new Exception("Date de départ mal écrite");

            System.out.print("Date d'arrivée (jj/mm/aaaa) : ");
            tokenizer = new Scanner((new Scanner(System.in)).nextLine());
            if (tokenizer.hasNext()) {
                dateArrivee = tokenizer.next(); // récupère le premier mot
            }
            if (!Pattern.matches("[0-9]{1,2}/[0-9]{1,2}/[0-9]{4}", dateArrivee))
                throw new Exception("Date d'arrivée mal écrite");

            System.out.print("Horaire de départ (hh:mm) : ");
            tokenizer = new Scanner((new Scanner(System.in)).nextLine());
            if (tokenizer.hasNext()) {
                horaireDepart = tokenizer.next(); // récupère le premier mot
            }
            if (!Pattern.matches("[0-9]{1,2}:[0-9]{1,2}", horaireDepart))
                throw new Exception("Heure de départ mal écrite");

            System.out.print("Horaire d'arrivée (hh:mm) : ");
            tokenizer = new Scanner((new Scanner(System.in)).nextLine());
            if (tokenizer.hasNext()) {
                horaireArrivee = tokenizer.next(); // récupère le premier mot
            }
            if (!Pattern.matches("[0-9]{1,2}:[0-9]{1,2}", horaireArrivee))
                throw new Exception("Heure d'arrivée mal écrite");

            System.out
                    .println("Choissisez l'indice d'une ville de départ pour le trajet");
            depart.printVille();
            System.out.println("Votre choix :");
            tokenizer = new Scanner((new Scanner(System.in)).nextLine());
            if (tokenizer.hasNext()) {
                int o = Integer.parseInt(tokenizer.next()); // récupère le
                                                            // premier mot
                depart = depart.getVille(o);
            }

            System.out
                    .println("Choissisez l'indice d'une ville de d'arrivée pour le trajet");
            depart.printVille();
            System.out.println("Votre choix :");
            tokenizer = new Scanner((new Scanner(System.in)).nextLine());
            if (tokenizer.hasNext()) {
                int j = Integer.parseInt(tokenizer.next()); // récupère le
                                                            // premier mot
                arrivee = depart.getVille(j);
            }

            a.consulterVehicules();
            System.out.print("Véhicule (id) : ");
            tokenizer = new Scanner((new Scanner(System.in)).nextLine());
            if (tokenizer.hasNext()) {
                idVehicule = Integer.valueOf(tokenizer.next()); // récupère le
                // premier mot
            }

            // on récupère le véhicule choisi
            Vehicule v = a.getVehicule(idVehicule);
            if (v == null)
                throw new Exception("véhicule non reconnu");

            // on convertit les dates entrées en Calendar
            Calendar dateCompleteDepart = Serveur.textToCalendar(dateDepart,
                    horaireDepart);
            if (dateCompleteDepart == null)
                throw new Exception("date de départ mal écrite");

            Calendar dateCompleteArrivee = Serveur.textToCalendar(dateArrivee,
                    horaireArrivee);
            if (dateCompleteArrivee == null)
                throw new Exception("date d'arrivée mal écrite");

            System.out.println("Choissisez le prix du billet pour le trajet :");
            tokenizer = new Scanner((new Scanner(System.in)).nextLine());
            if (tokenizer.hasNext()) {
                prix = Float.parseFloat(tokenizer.next()); // récupère le
                                                           // premier mot
            }

            System.out
                    .print("Une couchette est t-elle proposée lors du trajet : o/n");
            tokenizer = new Scanner((new Scanner(System.in)).nextLine());
            if (tokenizer.hasNext()) {
                String reponse = tokenizer.next();
                if (reponse.compareTo("o") == 0)
                    couchette = true;
            } else {
                couchette = false;
            }

            System.out.print("Un repas est t-il proposé lors du trajet : o/n");
            tokenizer = new Scanner((new Scanner(System.in)).nextLine());
            if (tokenizer.hasNext()) {
                String reponse = tokenizer.next();
                if (reponse.compareTo("o") == 0)
                    repas = true;
            } else {
                repas = false;
            }

            // on créé le trajet voulu puis on l'ajoute
            Trajet t = new Trajet(dateCompleteDepart, dateCompleteArrivee,
                    depart, arrivee, v, a.getTrajetNewIdentifiant(), prix,
                    couchette, repas, v.getPremiereClasse(),
                    v.getSecondeClasse(), v.getClasseEco());

            a.addTrajet(t);
            a.consulterTrajet();

        } else if (quoi.equals("vehicule")) {
            // on demande les infos sur le véhicule à ajouter
            String vehicule = "";
            int premiereClasse = 0;
            int secondeClasse = 0;
            int classeEco = 0;

            // On demande à l'utilisateur toutes les infos qu'on veut
            // puis on vérifie si ce qui a été entré est correct
            System.out.print("Nom du véhicule : ");
            Scanner tokenizer = new Scanner((new Scanner(System.in)).nextLine());
            if (tokenizer.hasNext()) {
                vehicule = tokenizer.next(); // récupère le premier mot
            }
            if (vehicule.trim() == "")
                throw new Exception("Nom du véhicule vide");

            System.out.print("Capacité de la premiere classe : ");
            tokenizer = new Scanner((new Scanner(System.in)).nextLine());
            if (tokenizer.hasNext()) {
                premiereClasse = Integer.valueOf(tokenizer.next()); // récupère
                                                                    // le
                // premier mot
            }

            System.out.print("Capacité de la seconde classe : ");
            tokenizer = new Scanner((new Scanner(System.in)).nextLine());
            if (tokenizer.hasNext()) {
                secondeClasse = Integer.valueOf(tokenizer.next()); // récupère
                                                                   // le
                // premier mot
            }

            System.out.print("Capacité de la classe eco : ");
            tokenizer = new Scanner((new Scanner(System.in)).nextLine());
            if (tokenizer.hasNext()) {
                classeEco = Integer.valueOf(tokenizer.next()); // récupère le
                // premier mot
            }

            // on créé le véhicule voulu puis on l'ajoute
            Vehicule v = new Vehicule(vehicule, premiereClasse, secondeClasse,
                    classeEco, a.getVehiculeNewIdentifiant());

            a.addVehicule(v);
            a.consulterVehicules();
        } else {

            System.out
                    .println("Vous ne pouvez ajouter qu'un trajet ou un vehicule");

        }
    }

    /**
     * Modifier un trajet ou un véhicule
     * 
     * @param command
     *            la commande à exécuter
     * @throws Exception
     */
    private void modifier(Command command) throws Exception {
        if (!command.hasSecondWord()) {
            System.out.println("Modifier quoi ? trajet ou vehicule ?");
            return;
        }

        String quoi = command.getSecondWord();
        if (quoi.equals("trajet")) {
            // on demande les infos sur le trajet à ajouter
            Trajet trajetAModifier = null;
            String dateDepart = "";
            String dateArrivee = "";
            String horaireDepart = "";
            String horaireArrivee = "";
            Ville depart = Ville.BORDEAUX;
            Ville arrivee;
            int idVehicule = 0;
            float prix = 0;
            boolean couchette = false;
            boolean repas = false;

            a.consulterTrajet();
            // On demande à l'utilisateur l'identifiant du trajet à modifier
            System.out.print("Trajet à modifier (id) : ");
            Scanner tokenizer = new Scanner((new Scanner(System.in)).nextLine());
            if (tokenizer.hasNext()) {
                trajetAModifier = a
                        .getTrajet(Integer.valueOf(tokenizer.next())); // récupère
                // le
                // premier
                // mot
            }
            if (trajetAModifier != null) {
                System.out
                        .println("N'entrez rien si vous voulez la même valeur que précédemment.");

                // On demande à l'utilisateur toutes les infos qu'on veut
                // puis on vérifie si ce qui a été entré est correct
                // Si rien n'est entré, on ne change pas les valeurs
                System.out.print(new StringBuffer()
                        .append("Date de départ (jj/mm/aaaa) [")
                        .append(Serveur.calendarToDate(trajetAModifier
                                .getDateDepart())).append("] : "));
                tokenizer = new Scanner((new Scanner(System.in)).nextLine());
                if (tokenizer.hasNext()) {
                    dateDepart = tokenizer.next(); // récupère le premier mot
                } else {
                    dateDepart = Serveur.calendarToDate(trajetAModifier
                            .getDateDepart());
                }
                if (!Pattern.matches("[0-9]{1,2}/[0-9]{1,2}/[0-9]{4}",
                        dateDepart))
                    throw new Exception("Date de départ mal écrite");

                System.out.print(new StringBuffer()
                        .append("Date d'arrivée (jj/mm/aaaa) [")
                        .append(Serveur.calendarToDate(trajetAModifier
                                .getDateArrivee())).append("] : "));
                tokenizer = new Scanner((new Scanner(System.in)).nextLine());
                if (tokenizer.hasNext()) {
                    dateArrivee = tokenizer.next(); // récupère le premier mot
                } else {
                    dateArrivee = Serveur.calendarToDate(trajetAModifier
                            .getDateArrivee());
                }
                if (!Pattern.matches("[0-9]{1,2}/[0-9]{1,2}/[0-9]{4}",
                        dateArrivee))
                    throw new Exception("Date d'arrivée mal écrite");

                System.out.print(new StringBuffer()
                        .append("Horaire de départ (hh:mm) [")
                        .append(Serveur.calendarToTime(trajetAModifier
                                .getDateDepart())).append("] : "));
                tokenizer = new Scanner((new Scanner(System.in)).nextLine());
                if (tokenizer.hasNext()) {
                    horaireDepart = tokenizer.next(); // récupère le premier mot
                } else {
                    horaireDepart = Serveur.calendarToTime(trajetAModifier
                            .getDateDepart());
                }
                if (!Pattern.matches("[0-9]{1,2}:[0-9]{1,2}", horaireDepart))
                    throw new Exception("Heure de départ mal écrite");

                System.out.print(new StringBuffer()
                        .append("Horaire d'arrivée (hh:mm) [")
                        .append(Serveur.calendarToTime(trajetAModifier
                                .getDateArrivee())).append("] : "));
                tokenizer = new Scanner((new Scanner(System.in)).nextLine());
                if (tokenizer.hasNext()) {
                    horaireArrivee = tokenizer.next(); // récupère le premier
                    // mot
                } else {
                    horaireArrivee = Serveur.calendarToTime(trajetAModifier
                            .getDateArrivee());
                }
                if (!Pattern.matches("[0-9]{1,2}:[0-9]{1,2}", horaireArrivee))
                    throw new Exception("Heure d'arrivée mal écrite");

                System.out.print(new StringBuffer().append("Lieu de départ [")
                        .append(trajetAModifier.getDepart()).append("] : "));
                depart.printVille();
                System.out
                        .println("Choissisez l'identifiant de la nouvelle ville de départ :");
                tokenizer = new Scanner((new Scanner(System.in)).nextLine());
                if (tokenizer.hasNext()) {
                    int y = Integer.parseInt(tokenizer.next()); // récupère le
                                                                // premier mot
                    depart = depart.getVille(y);
                } else {
                    depart = trajetAModifier.getDepart();
                }

                System.out.print(new StringBuffer().append("Lieu de départ [")
                        .append(trajetAModifier.getDepart()).append("] : "));
                depart.printVille();
                System.out
                        .println("Choissisez l'identifiant de la nouvelle ville d'arrivée :");
                tokenizer = new Scanner((new Scanner(System.in)).nextLine());
                if (tokenizer.hasNext()) {
                    int z = Integer.parseInt(tokenizer.next()); // récupère le
                                                                // premier mot
                    arrivee = depart.getVille(z);
                } else {
                    arrivee = trajetAModifier.getDepart();
                }

                a.consulterVehicules();
                System.out.print(new StringBuffer().append("Véhicule (id) [")
                        .append(trajetAModifier.getVehicule().getIdentifiant())
                        .append("] : "));
                tokenizer = new Scanner((new Scanner(System.in)).nextLine());
                if (tokenizer.hasNext()) {
                    idVehicule = Integer.valueOf(tokenizer.next()); // récupère
                    // le
                    // premier
                    // mot
                } else {
                    idVehicule = trajetAModifier.getVehicule().getIdentifiant();
                }

                // on créé le véhicule voulu
                Vehicule v = a.getVehicule(idVehicule);
                if (v == null)
                    throw new Exception("véhicule non reconnu");

                // on convertit les dates entrées en Calendar
                Calendar dateCompleteDepart = Serveur.textToCalendar(
                        dateDepart, horaireDepart);
                if (dateCompleteDepart == null)
                    throw new Exception("date de départ mal écrite");
                Calendar dateCompleteArrivee = Serveur.textToCalendar(
                        dateArrivee, horaireArrivee);
                if (dateCompleteArrivee == null)
                    throw new Exception("date d'arrivée mal écrite");

                System.out.print(new StringBuffer()
                        .append("Entrez votre nouveau prix : "));
                tokenizer = new Scanner((new Scanner(System.in)).nextLine());
                if (tokenizer.hasNext()) {
                    prix = Float.parseFloat(tokenizer.next()); // récupère
                                                               // le
                                                               // premier
                                                               // mot
                } else {
                    prix = trajetAModifier.getPrix();
                }

                System.out
                        .print(new StringBuffer()
                                .append("Une couchette est t-elle proposée lors du trajet : o/n"));
                tokenizer = new Scanner((new Scanner(System.in)).nextLine());
                if (tokenizer.hasNext()) {
                    String reponse = tokenizer.next();
                    if (reponse.compareTo("o") == 0)
                        couchette = true;
                } else {
                    couchette = false;
                }

                System.out
                        .print(new StringBuffer()
                                .append("Un repas est t-il proposé lors du trajet : o/n"));
                tokenizer = new Scanner((new Scanner(System.in)).nextLine());
                if (tokenizer.hasNext()) {
                    String reponse = tokenizer.next();
                    if (reponse.compareTo("o") == 0)
                        repas = true;
                } else {
                    repas = false;
                }

                // On créé le nouveau trajet puis on le met à la place de
                // l'ancien
                Trajet t = new Trajet(dateCompleteDepart, dateCompleteArrivee,
                        depart, arrivee, v, trajetAModifier.getIdentifiant(),
                        prix, couchette, repas,
                        trajetAModifier.getPlacesPremieres(),
                        trajetAModifier.getPlacesSeconde(),
                        trajetAModifier.getPlacesEco());
                a.modifierTrajet(trajetAModifier, t);
                a.consulterTrajet();
            } else {
                throw new Exception(
                        "Aucun trajet ne correspond à cet identifiant");
            }
        } else if (quoi.equals("vehicule")) {
            // on demande les infos sur le véhicule à ajouter
            Vehicule vehiculeAModifier = null;
            String vehicule = "";
            int premiereClasse = 0;
            int secondeClasse = 0;
            int classeEco = 0;

            a.consulterVehicules();
            // On demande à l'utilisateur l'identifiant du véhicule à modifier
            System.out.print("Véhicule à modifier (id) : ");
            Scanner tokenizer = new Scanner((new Scanner(System.in)).nextLine());
            if (tokenizer.hasNext()) {
                vehiculeAModifier = a.getVehicule(Integer.valueOf(tokenizer
                        .next())); // get first word
            }
            if (vehiculeAModifier != null) {
                System.out
                        .println("N'entrez rien si vous voulez la même valeur que précédemment.");

                // On demande à l'utilisateur toutes les infos qu'on veut
                // puis on vérifie si ce qui a été entré est correct
                // Si rien n'est entré, on ne change pas les valeurs
                System.out
                        .print(new StringBuffer().append("Nom du véhicule [")
                                .append(vehiculeAModifier.getVehicule())
                                .append("] : "));
                tokenizer = new Scanner((new Scanner(System.in)).nextLine());
                if (tokenizer.hasNext()) {
                    vehicule = tokenizer.next(); // récupère le premier mot
                } else {
                    vehicule = vehiculeAModifier.getVehicule();
                }
                if (vehicule.trim() == "")
                    throw new Exception("Nom du véhicule vide");

                System.out.print(new StringBuffer()
                        .append("Capacité de la premiere classe [")
                        .append(vehiculeAModifier.getPremiereClasse())
                        .append("] : "));
                tokenizer = new Scanner((new Scanner(System.in)).nextLine());
                if (tokenizer.hasNext()) {
                    premiereClasse = Integer.valueOf(tokenizer.next()); // récupère
                                                                        // le
                    // premier mot
                } else {
                    premiereClasse = vehiculeAModifier.getPremiereClasse();
                }

                System.out.print(new StringBuffer()
                        .append("Capacité de la seconde classe [")
                        .append(vehiculeAModifier.getSecondeClasse())
                        .append("] : "));
                tokenizer = new Scanner((new Scanner(System.in)).nextLine());
                if (tokenizer.hasNext()) {
                    secondeClasse = Integer.valueOf(tokenizer.next()); // récupère
                                                                       // le
                    // premier mot
                } else {
                    secondeClasse = vehiculeAModifier.getSecondeClasse();
                }

                System.out.print(new StringBuffer()
                        .append("Capacité de la classe eco [")
                        .append(vehiculeAModifier.getClasseEco())
                        .append("] : "));
                tokenizer = new Scanner((new Scanner(System.in)).nextLine());
                if (tokenizer.hasNext()) {
                    classeEco = Integer.valueOf(tokenizer.next()); // récupère
                                                                   // le
                    // premier mot
                } else {
                    classeEco = vehiculeAModifier.getClasseEco();
                }

                // on créé le nouveau véhicule, puis on le met à la place de
                // l'ancien
                Vehicule v = new Vehicule(vehicule, premiereClasse,
                        secondeClasse, classeEco,
                        vehiculeAModifier.getIdentifiant());
                a.modifierVehicule(vehiculeAModifier, v);
                a.consulterVehicules();
            } else {
                throw new Exception(
                        "Aucun véhicule ne correspond à cet identifiant");
            }
        } else {
            System.out
                    .println("Vous ne pouvez modifier qu'un trajet ou un vehicule");
        }
    }

    /**
     * Supprimer un véhicule ou un trajet
     * 
     * @param command
     *            la commande à exécuter
     */
    private void supprimer(Command command) {
        if (!command.hasSecondWord()) {
            System.out.println("Supprimer quoi ? trajet ou vehicule ?");
            return;
        }

        String quoi = command.getSecondWord();
        if (quoi.equals("trajet")) {
            Trajet trajetASupprimer = null;

            a.consulterTrajet();
            // On demande à l'utilisateur l'identifiant du trajet à supprimer
            System.out.print("Trajet à supprimer (id) : ");
            Scanner tokenizer = new Scanner((new Scanner(System.in)).nextLine());
            if (tokenizer.hasNext()) {
                trajetASupprimer = a
                        .getTrajet(Integer.valueOf(tokenizer.next())); // récupère
                // le
                // premier
                // mot
            }
            // on le supprime s'il existe
            if (trajetASupprimer != null) {
                a.removeTrajet(trajetASupprimer);
            }
        } else if (quoi.equals("vehicule")) {
            Vehicule vehiculeASupprimer = null;

            a.consulterVehicules();
            // On demande à l'utilisateur l'identifiant du véhicule à supprimer
            System.out.print("Vehicule à supprimer (id) : ");
            Scanner tokenizer = new Scanner((new Scanner(System.in)).nextLine());
            if (tokenizer.hasNext()) {
                vehiculeASupprimer = a.getVehicule(Integer.valueOf(tokenizer
                        .next())); // récupère le premier mot
            }
            // on le supprime s'il existe
            if (vehiculeASupprimer != null) {
                a.removeVehicule(vehiculeASupprimer);
            }
        } else {
            System.out
                    .println("Vous ne pouvez supprimer qu'un trajet ou un vehicule");
        }
    }

    public void html(Trajet t, int place, String nom, Billet billet) {

        try {
            PrintWriter ecrire;
            ecrire = new PrintWriter(new BufferedWriter(new FileWriter(
                    "Reservation.html")));

            ecrire.println("<html> <head>\n ");
            ecrire.println("<meta charset=\"utf-8\" />  \n <title>Reservation Client </title>  \n");

            ecrire.println(" </head>    <body>    <center> <p> Nom: " + nom
                    + " </p>      <p> Voyage en: "
                    + t.getVehicule().getVehicule()
                    + " </p>   <p>  Date de départ le "
                    + calendarToDate(t.getDateDepart()) + " à "
                    + calendarToTime(t.getDateDepart())
                    + "</p>  Date d'arrivée le "
                    + calendarToDate(t.getDateArrivee()) + " à "
                    + calendarToTime(t.getDateArrivee())
                    + "</p>  <p> Ville de détpart : "
                    + t.getDepart().toString() + " </p> <p> Ville d'arrivée : "
                    + t.getArrivee().toString()
                    + " </p> <p> Nombre de place prise : " + place
                    + " </p> <p> Prix : " + billet.getPrixFinal()
                    + " </center>  </body> </html>");

            ecrire.close();
        } catch (Exception IOException) {
        }
        ;

    }

    static public String calendarToDate(Calendar c) {
        return new StringBuffer().append(String.valueOf(c.get(Calendar.DATE)))
                .append("/").append(String.valueOf(c.get(Calendar.MONTH) + 1))
                .append("/").append(String.valueOf(c.get(Calendar.YEAR)))
                .toString();
    }

    static public String calendarToTime(Calendar c) {
        return new StringBuffer()
                .append(String.valueOf(c.get(Calendar.HOUR_OF_DAY)))
                .append(":").append(String.valueOf(c.get(Calendar.MINUTE)))
                .toString();
    }

    public void printOffre() {
        System.out
                .println("Un billet adulte coute la totalité du prix d'un billet.\nUn billet enfant (age < 14)"
                        + " coute 50% du prix d'un billet.\nNous faisons également une remise de 10% sur chaque billet si vous "
                        + "voyagez en groupe (au moins 4 places achetées simultanément).\n"
                        + "La premiere classe multiplie par 3 le prix du billet de base.\n"
                        + "La seconde classe multiplie par 2 le prix du billet de base.\n"
                        + "La classe eco ne modifie pas le prix du billet de base.");
    }

}
